/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo;

/**
 *
 * @author JUAN CARLOS
 */


import java.util.*;
import Vista.*;
import Controlador.*;
import java.awt.Graphics;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.*;
import java.awt.*;

public class Juego implements Serializable {
    public static int gold=1000000;
    public static int silver=100;
    public static int energia=30;
    public static int petroleo=200;
    public static int madera=200;
    public static int experiencia=0;
    public static int turno=0;

    public static int nivel=10000;

    

    public static int poblacionTotal=100;
    public static int poblacionActual=0;
    public static String nombreMapa;
    private static String nombreCiudad;
    private boolean nuevo=true;
    public ArrayList<Amigo> amigos=new ArrayList<Amigo>();
    public ArrayList<Construccion> construcciones = new ArrayList<Construccion>();
    public ArrayList<Coordenadas> posicion = new ArrayList<Coordenadas>();
    public Mapa mapa ;
    public Legion []armada=new Legion[9];
    public ArrayList <UnidadMilitar> myTeam = new ArrayList<UnidadMilitar>();;
    public ArrayList <UnidadMilitar> enemyTeam;
    private Amigo rival;
    private int indBatalla;
    public int LimiteI;
    public int LimiteS;
    public int opcionBatalla;

    	/*	============ ATRIBUTOS ============ */
    public Juego(){}
    public Juego(String nombreCiudad,Mapa mapa){
        this.nombreCiudad = nombreCiudad;
        this.mapa=mapa;
        for(int i=0;i<9;i++)
                armada[i]=new Legion();

        System.out.println("FELICITACIONES!!! Tu imperio "+nombreCiudad+" ha sido creado");
        GestorAmigos.addAmigo(new Amigo("Carlos"));
        GestorAmigos.addAmigo(new Amigo("Steele"));
        GestorAmigos.addAmigo(new Amigo("Victor"));
        GestorAmigos.addAmigo(new Amigo("JuanCarlos"));
    }
    public String reporte1(){
        if( nivel < (int)Math.sqrt((double)experiencia)+1 ) {nivel++;energia=30;}
        String resp = "Nivel: " + nivel + "      Oro: " + gold + "      Mineral: " + silver + "      Petroleo: " + petroleo + "      Madera: " + madera ;
        return resp ;
    }

    public String reporte2(){
        String resp = "Energia: " + energia + "      Experiencia: " + experiencia + "      Pob. Actual: "  + poblacionActual + "      Pob. Total: " + poblacionTotal
                + "  Turno"+turno;
        return resp ;
    }


  /*  public void start(String nombCiudad) throws IOException, ClassNotFoundException{
        if(nombCiudad.length()>0){
            String nombArchIn = nombCiudad + "juego.bin";
            ObjectInputStream Lector = new ObjectInputStream(new BufferedInputStream(new FileInputStream(nombArchIn)));
            Jugador objetoJugador = null;
            try{
                amigos=( ArrayList<Amigo> )Lector.readObject();
                construcciones=(ArrayList<Construccion>)Lector.readObject();
                posicion=(ArrayList<Coordenadas>)Lector.readObject();
                objetoJugador=(Jugador)Lector.readObject();
                armada= (Legion[])Lector.readObject();
            }
            catch(Exception e){
            }
            //construcciones=(ArrayList<Construccion> ) XMLar.leer(nombCiudad+"construcciones.txt");
            //posicion=(ArrayList<Coordenadas>)XMLar.leer(nombCiudad+"coordenadas.txt");
            //armada= (Legion[])XMLar.leer(nombCiudad+"armada.txt");
            //Jugador objetoJugador=(Jugador)XMLar.leer(nombCiudad+"jugador.txt");
            madera=objetoJugador.getMadera();
            silver=objetoJugador.getSilver();
            gold=objetoJugador.getGold();
            petroleo=objetoJugador.getPetroleo();
            energia=objetoJugador.getEnergia();
            experiencia=objetoJugador.getExperiencia();
            turno=objetoJugador.getTurno();
            poblacionActual=objetoJugador.getPoblacionActual();
            poblacionTotal=objetoJugador.getPoblacionTotal();
            nivel=objetoJugador.getNivel();
            nombreMapa=objetoJugador.getNombreMapa();
            nombreCiudad=objetoJugador.getNombreCiudad();
            mapa=new Mapa(nombreMapa,construcciones,posicion,armada);
            nuevo=false;
            Lector.close();
        }
        else{
            for(int i=0;i<9;i++)
                armada[i]=new Legion();
            String obj = "walter";
              Amigo objeto;
              amigos=( ArrayList<Amigo> ) XMLar.leer("amigos.txt");
//            objeto = new Amigo(obj);
//            amigos.add(objeto);
//            amigos.add(new Amigo("Carlos"));
//            amigos.add(new Amigo("Steele"));
//            amigos.add(new Amigo("Victor"));
//            amigos.add(new Amigo("JuanCarlos"));
            mapa=new Mapa();
        }



       /* public void start(){
             for(int i=0;i<9;i++)
                armada[i]=new Legion();
            String obj = "walter";
            Amigo objeto;
            amigos=( ArrayList<Amigo> ) XMLar.leer("amigos.txt");
//            objeto = new Amigo(obj);
//            amigos.add(objeto);
//            amigos.add(new Amigo("Carlos"));
//            amigos.add(new Amigo("Steele"));
//            amigos.add(new Amigo("Victor"));
//            amigos.add(new Amigo("JuanCarlos"));
            mapa=new Mapa();
        /*

        /*
        for(int i=0;i<9;i++)
            armada[i]=new Legion();
        String obj = "walter";
        Amigo objeto;
        objeto = new Amigo(obj);
        amigos.add(objeto);
        amigos.add(new Amigo("Carlos"));
        amigos.add(new Amigo("Steele"));
        amigos.add(new Amigo("Victor"));
        amigos.add(new Amigo("JuanCarlos"));
        */


      /*  mapa.mostrar();
        Coordenadas coor;

        while(true){
        //pedir comando
            //Datos.imprimirComandos();

            int numComando=Datos.leerOpcion(0,7);
            numComando--;
            if(numComando==4){
                System.out.println("Está seguro que deseas salir? SI / NO");
                Scanner read =new Scanner(System.in);
                String answer=read.nextLine();
                if(answer.equals("SI")) {
                    System.out.println("Salio del Juego");
                    String nombArchOut = nombreCiudad + "juego.bin";
                    ObjectOutputStream Escritor = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(nombArchOut)));
                    Escritor.writeObject(amigos);
//                    Escritor.close();
                    //Escritor = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("construcciones.txt")));
                    Escritor.writeObject(construcciones);
//                    Escritor.close();
//                    Escritor = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("coordenadas.txt")));
                    Escritor.writeObject(posicion);
//                    Escritor.close();
//                    Escritor = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("jugador.txt")));
                    Jugador jugador=new Jugador(madera,gold,petroleo,silver,nivel,experiencia,energia,nombreCiudad,poblacionTotal,poblacionActual,turno,nombreMapa);
                    Escritor.writeObject(jugador);
//                    Escritor.close();
//                    Escritor = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("armada.txt")));
                    Escritor.writeObject(armada);
                    Escritor.close();
//                    XMLar.serializar(amigos,nombreCiudad +"amigos.txt");
//                    XMLar.serializar(posicion,nombreCiudad+"coordenadas.txt");
//                    XMLar.serializar(construcciones,nombreCiudad+"construcciones.txt");
//                    Jugador jugador=new Jugador(madera,gold,petroleo,silver,nivel,experiencia,energia,nombreCiudad,poblacionTotal,poblacionActual,turno,nombreMapa);
//                    XMLar.serializar(jugador,nombreCiudad+"jugador.txt");
//                    XMLar.serializar(armada,nombreCiudad+"armada.txt");
                    if(nuevo){
                        try{
                            BufferedWriter bw=new BufferedWriter(new FileWriter("Partida.txt",true));
                            bw.write(nombreCiudad+"\n");
                            bw.close();}
                        catch (Exception e){}
                    }
                    break; //sale del bucle principal del juego
                }
            }

            else{
                int x=0,y=0;
                switch(numComando){
                    //PARA NOSOTROS "X" ES PARA LO QUE EL USUARIO ES "Y" y VICEVERSA
                    case 0:

                        coor=Datos.leerCoordenada(mapa.getTamX(),mapa.getTamY());
                        recolectar(coor.getX(),coor.getY()); break;
                    case 1:
                        coor=Datos.leerCoordenada(mapa.getTamX(),mapa.getTamY());

                        //construir(coor.getX(),coor.getY());
                        break;
                    case 2:
                        coor = Datos.leerCoordenada(mapa.getTamX(),mapa.getTamY());
                        crear(coor.getX(),coor.getY()); break;
                    case 3:
                        turno(); break;
                    case 5: //amigo
                        coor=Datos.leerCoordenada(mapa.getTamX(),mapa.getTamY());
                        contratar(coor.getX(),coor.getY());
                        break;
                    case 6:
                        invadir(); break;
                    case 7:
                        ayudar();
                        break;
                }
            }

            mapa.mostrar();
        }
    }*/
    public void ayudar(){
        try {
            BufferedReader Layuda= new BufferedReader(new FileReader("Ayuda.txt"));
            String cad;
            while((cad=Layuda.readLine())!=null)
                System.out.println(cad);
            Layuda.close();
        }
        catch (Exception e){}
    }
    public void invadir(int opcion){
	Scanner sc = new Scanner(System.in);
	int i,win;
	//int opcion = 0;
	/*System.out.println("Elija el amigo que desee invadir");

	for(i=0;i<amigos.size();i++)
		System.out.println(i+1 + ") " + amigos.get(i).getNombre());

	opcion = sc.nextInt();

	while(opcion<0 || opcion>12){
		System.out.println("ingrese una opcion adecuada");
		opcion = sc.nextInt();
	}*/
	//ya eligio la opcion

	/*AQUI COMIENZA LA BATALLA*/
        this.rival = GestorAmigos.getAmigo(opcion); //si win es 1 entonces gano si es 0 entonces perdio

       /* if (win == 1) {
            Juego.gold+=500;
            System.out.println("felicitaciones!!! gano la batalla, ha ganado 500 de oro");
	}

	else System.out.println("perdio la batalla");*/
}

    public int combatir(int opcion){
	myTeam = new ArrayList<UnidadMilitar>();
	enemyTeam=null;
        opcionBatalla = opcion;
	//Scanner sc = new Scanner(System.in);
	//int opcion = -1;
        int resultado = 0;
        int escenario=0;
        System.out.println("1) Tierra");
        System.out.println("2) Mar");
        System.out.println("3) Aire");
        boolean escenarioCorrecto=false;
        System.out.println("opcion elegida dentro del applet: "+opcion);
     //   while(!escenarioCorrecto){
          /*  System.out.println("Elige el escenario en el que deseas pelear?");
            System.out.println("1) Tierra");
            System.out.println("2) Mar");
            System.out.println("3) Aire");*/

            //String a = sc.nextLine();
            /*if (a.equals("1"))
                enemyTeam = rival.getTeam("Tierra");
            else if(a.equals("2"))
                enemyTeam = rival.getTeam("Mar");
            else if(a.equals("3"))
                enemyTeam = rival.getTeam("Aire");
            */
           // opcion=Datos.leerOpcion(0, 2);

        //pintar los posibles escenerarios para pelear
        //opcion = getpos...

            switch(opcion+1){
                case 1:enemyTeam=rival.getTeam("Tierra");break;
                case 2:enemyTeam=rival.getTeam("Mar");break;
                case 3:enemyTeam=rival.getTeam("Aire");break;
            }

            armada[0].setTipoUnidad("Soldado");
            armada[0].agregarUnidad(new Soldado(), 5, 5);
            armada[0].agregarUnidad(new Soldado(), 5, 5);
            armada[1].setTipoUnidad("Tanque");
            armada[1].agregarUnidad(new Tanque(), 5, 5);

            /*while(true){
                while (a.length()>1){
                    System.out.println("Debe ingresar solo un caracter del 1 al 3");
                    a = sc.nextLine();
                }

                if (a.compareTo("4")<0 && a.compareTo("0")>0){
                    opcion = Integer.parseInt(a);
                    break;
                }
                else{
                    System.out.println("Debe ingresar solo un caracter del 1 al 3");
                    a = sc.nextLine();
                }
            }*/
//TOMAR EN CUENTAAAA
            switch(opcion+1){
		case 1:
			FormarEquipoCombate(0,3);
			if(myTeam==null)
                            escenarioCorrecto = false;
			else //resultado = iniciarBatalla(myTeam, enemyTeam);
                        {
                            escenarioCorrecto = true;}

                        break;
		case 2:
			FormarEquipoCombate(3,6);
			if(myTeam==null)
                            escenarioCorrecto = false;
			else {//resultado =  iniciarBatalla(myTeam, enemyTeam);
                            escenarioCorrecto = true;
                        }
                        break;
		case 3:
			FormarEquipoCombate(6,8);
			if(myTeam==null)
                            escenarioCorrecto = false;
			else {//resultado =  iniciarBatalla(myTeam, enemyTeam);
                            escenarioCorrecto = true;
                        }
                        break;
            }
     //  }
/*
	for(int i=0; i<myTeam.size() ;i++)
            if(myTeam.get(i).getVida()<=0){
                if( myTeam.get(i) instanceof Soldado ) opcion=0;
		else if( myTeam.get(i) instanceof Tanque ) opcion=1;
		else if( myTeam.get(i) instanceof Canhon ) opcion=2;
		else if( myTeam.get(i) instanceof Canhonera) opcion = 3;
		else if( myTeam.get(i) instanceof PortaAviones) opcion = 4;
		else if( myTeam.get(i) instanceof Acorazado ) opcion = 5;
		else if( myTeam.get(i) instanceof Avion) opcion = 6;
		else if( myTeam.get(i) instanceof Helicoptero) opcion =7;
		else if( myTeam.get(i) instanceof Bombardero) opcion = 8;
		mapa.eliminaUnidad(armada[opcion].getX(),armada[opcion].getY());
		armada[opcion].eliminarUnidad();
            }
        if (resultado==1) armada[opcion].actualizarWin();
        else armada[opcion].actualizarLoose();*/
	return resultado;
        //return 0;
    }

    public void setindice(int i){
        this.indBatalla = i;
    }
    public int getindice(){
        return this.indBatalla;
    }

    public void actualizarArmada(int resultado){
        int opcion = this.opcionBatalla;
        for(int i=0; i<myTeam.size() ;i++)
            if(myTeam.get(i).getVida()<=0){
                if( myTeam.get(i) instanceof Soldado ) opcion=0;
		else if( myTeam.get(i) instanceof Tanque ) opcion=1;
		else if( myTeam.get(i) instanceof Canhon ) opcion=2;
		else if( myTeam.get(i) instanceof Canhonera) opcion = 3;
		else if( myTeam.get(i) instanceof PortaAviones) opcion = 4;
		else if( myTeam.get(i) instanceof Acorazado ) opcion = 5;
		else if( myTeam.get(i) instanceof Avion) opcion = 6;
		else if( myTeam.get(i) instanceof Helicoptero) opcion =7;
		else if( myTeam.get(i) instanceof Bombardero) opcion = 8;
		mapa.eliminaUnidad(armada[opcion].getX(),armada[opcion].getY());
		armada[opcion].eliminarUnidad();
            }
        if (resultado==1) armada[opcion].actualizarWin();
        else armada[opcion].actualizarLoose();
    }
    public ArrayList <UnidadMilitar> FormarEquipoCombate(int limitI, int limitS){
	//ArrayList <UnidadMilitar> Team = new ArrayList<UnidadMilitar>();
	//Scanner sc = new Scanner(System.in);

        int opcion;
	int indice;
        this.LimiteI = limitI;
        this.LimiteS = limitS;
        /*for (int j=0;j<5;j++){
            indice = 0;
            Datos.cleanDown();*/
            indice = 0;
            for(int i=limitI;i<limitS;i++){
		/*if*/ armada[i].getCantidadP();//{ //si esque tenemos armada del tipo seleccionado esto es tanques o soldados, etc..
                   // System.out.print((i+1) + ") ");
//                    for(int j = 0; j<= i;j++)
//                        armada[j].mostrar(indice);
                    if (armada[i].getCantidadP()>0){ indice++;
                        Datos.cleanDown();
                        for(int j = 0; j<= i;j++)
                            armada[j].mostrar(j);
                    }
                    //}
            }
           // if (indice>0){ //si es que hay unidades
            setindice(indice);
            //AQUI EMPIEZA LA COMENTADA del tipo solicitado
		//System.out.println("ingrese el indice de la unidad que desea agregar al equipo de combate");

               // opcion=Datos.leerOpcion(0,limitS);
		//String a = sc.nextLine();
		/*while(true){

                }*/
              //  --opcion; //CONTINUA LA COMENTADAA
		//Team.add(armada[opcion].getUnidad());
           // }

            //else{// ya no quedan mas unidades del tipo seleccionado
              //  if (Team.isEmpty()) System.out.println("No tiene unidades en el escenario seleccionado");
            	//break;
          //  }  //TEMINO DE LA COMENTADA
	//}
      /*  if (!Team.isEmpty()) {
            System.out.println("Se formo el equipo de combate con " + Team.size() + " unidades");
            return Team;
        }
        else*/
            return null;
    }
    public void elegirEquipo(int opcion){
        if (this.indBatalla>0 && armada[opcion] != null && armada[opcion].getCantidadP()>0)
            myTeam.add(armada[opcion].getUnidad());
//        switch (opcion){
//            case 1:
//            case 2:
//            case 3:
//        }
    }

    public int iniciarBatalla(/*ArrayList <UnidadMilitar> myTeam, ArrayList <UnidadMilitar> enemyTeam*/){
	int i;
	boolean viveMyTeam ;
	boolean viveEnemyTeam ;
	int vida;
	int bonus=0;
        int enemyBonus=0;
        int danho = 0; int danho1 = 0;
        int x = -1 ; int y= -1;
        int x1= -1 ; int y1=-1;
        int turno = 0;
        String contra= "";
        String nombre= " ";
	while (true) {
                viveMyTeam = false;
                viveEnemyTeam = false;
		for(i=0;i<myTeam.size();i++)
			viveMyTeam = viveMyTeam || (myTeam.get(i).getVida()>0);
		for(i=0;i<enemyTeam.size();i++)
			viveEnemyTeam = viveEnemyTeam || (enemyTeam.get(i).getVida()>0);

		if (viveMyTeam == false)
			return 0;
		if (viveEnemyTeam == false)
			return 1;

		if (turno == 0){
                        Random ar=new Random();
                        System.out.println("MY TEAM: ");
                        //Datos.mostrar("MY TEAM: ");
			eligeUnidad(myTeam, danho1,y1,enemyBonus);
                        while(true){

                                x= ar.nextInt(myTeam.size());
                                if(myTeam.get(x).getVida()>0) break;
                        }
                                
			//Datos.mostrar("ENEMY TEAM: ");
                        System.out.println("ENEMY TEAM: ");
                        eligeUnidad(enemyTeam, danho,y,bonus);
                        while(true){

                            y= ar.nextInt(enemyTeam.size());
                            if(enemyTeam.get(y).getVida()>0) break;
                        }
                                
                        if(myTeam.get(x).getVida()>0 && enemyTeam.get(y).getVida()>0){
                                bonus = 0;
                                for(i=0;i<3;i++){
                                    contra = (myTeam.get(x).getContra())[i];
                                    nombre = enemyTeam.get(y).getNombre();
                                    if (contra.equals(nombre)){ bonus = 10; break;}
                                }
                                danho = myTeam.get(x).getAtaque();
				enemyTeam.get(y).setVida(enemyTeam.get(y).getVida() - danho - bonus);
				turno = 1;
			}
			else System.out.println("Eligio unidades incorrectas");
		}
		else{
			Random ar=new Random();
			while(true){
                            x1= ar.nextInt(enemyTeam.size());
                            if(enemyTeam.get(x1).getVida()>0) break;
                        }
                        while(true){
                            y1= ar.nextInt(myTeam.size());
                            if(myTeam.get(y1).getVida()>0) break;
                        }
			if(enemyTeam.get(x1).getVida()>0 && myTeam.get(y1).getVida()>0){
				enemyBonus = 0;
                                for(i=0;i<3;i++){
                                    contra = (enemyTeam.get(x1).getContra())[i];
                                    nombre = myTeam.get(y1).getNombre();
                                    if (contra.equals(nombre)){ enemyBonus = 10; break;}
                                }
				danho1 = enemyTeam.get(x1).getAtaque();
                                myTeam.get(y1).setVida(myTeam.get(y1).getVida() - danho1 - enemyBonus);
				turno = 0;
			}
		}

	}
}
    public int eligeUnidad(ArrayList <UnidadMilitar> a , int danho, int opc, int bonus){
        for(int i=0;i<a.size();i++){
            System.out.print("["+(i+1)+"] Unidad: " + a.get(i).getNombre() + "  vida: " + a.get(i).getVida());
            if (danho>0 && opc == i){
                System.out.print(" daño recibido: " + danho);
                if (bonus>0) System.out.print(" +" + bonus + " bonus");
            }
            System.out.println();
        }
        //int opcion=Datos.leerOpcion(0,a.size());
        //opcion--;
        int opcion = 0;
        return opcion;
    }

    public void contratar(int x, int y){
        //System.out.println("ENTRE");
       if(!mapa.ocupado(x,y)) System.out.println("No hay construccion en esa coordenada");
        //si el objeto creado es de tipo gobierno
       else if( mapa.getObjeto(x,y) instanceof Gobierno ){
            //muestro lista de amigos
            for(int i = 0;i< amigos.size() ; i++)
                System.out.println("["+(i+1)+"] Nombre del amigo: " +amigos.get(i).getNombre());

            int opcion=Datos.leerOpcion(0,amigos.size());
            Gobierno obj= (Gobierno)(mapa.getObjeto(x,y));
            obj.contratar(amigos.get(opcion-1));
        }
    }

    public boolean sepuede(int x,int y){

        posicion=GestorConstrucciones.coordenadas;
        construcciones=GestorConstrucciones.construcciones;
        if (energia>0){
            Construccion ob=(Construccion)mapa.getObjeto(x, y);
            if( ob.getEstado()!=-1){
                if( ( ob.getDuracion() + ob.getTiempoInicial()) <= turno ){
                        return true;
                 }
            }Datos.mostrar("Aun no finaliza la tarea");
        }
        else{
            Datos.mostrar("No tiene la suficiente energia");
        }
        return false;
    }
    public void recolectar(int x,int y,int xx,int yy){
        Construccion ob=(Construccion)mapa.getObjeto(x, y);
        Datos.mostrarPrincipal("enctre recolectar en si");
        if(xx==-1 && yy==-1){
            if(ob instanceof Vivienda)
                ((Vivienda)ob).recolectar();
            else if(ob instanceof Gobierno)
                ((Gobierno)ob).recolectar();
            else if(ob instanceof Industria)
                ((Industria)ob).recolectar();
        }
        else{
            UnidadMilitar unidad=((Militar)ob).recolectarUnidad();
            int opcion=0;
            if( unidad instanceof Soldado ) opcion=0;
            else if( unidad instanceof Tanque ) opcion=1;
            else if( unidad instanceof Canhon ) opcion=2;
            else if( unidad instanceof Canhonera) opcion = 3;
            else if( unidad instanceof PortaAviones) opcion = 4;
            else if( unidad instanceof Acorazado ) opcion = 5;
            else if( unidad instanceof Avion) opcion = 6;
            else if( unidad instanceof Helicoptero) opcion =7;
            else if( unidad instanceof Bombardero) opcion = 8;
            //System.out.println("OPCION " + opcion);
            if (armada[opcion].getTipoUnidad()==null) armada[opcion].setTipoUnidad(unidad.getNombre());
            armada[opcion].agregarUnidad(((UnidadMilitar)unidad),xx,yy);
            mapa.ubicarObjeto(xx, yy, unidad);
        }
    }
//    public void recolectar(int x,int y,int xx,int yy){
//    //VERIFICAR Coordenadas (construccion?? incorrecta : correcta)
//    //SI CORRECTA VALIDAR RECOLECCION ( -1 PTO. ENERGIA)
//        System.out.println("x "+x+ " ");
//        int i;
//        posicion=GestorConstrucciones.coordenadas;
//        construcciones=GestorConstrucciones.construcciones;
//        for (i=0;i<posicion.size();i++)
//            if(x>=posicion.get(i).getX() && y>=posicion.get(i).getY() &&
//                x<=construcciones.get(i).getLongx()+posicion.get(i).getX() &&
//                y<=construcciones.get(i).getLongy()+posicion.get(i).getY() ) break;
//        i=0;
//        Datos.mostrarPrincipal(i+"");
//            if(i==posicion.size())
//                System.out.println("No se encontro construccion en esas Coordenadas");
//                //Datos.mostrar("No se encontro construccion en esas Coordenadas"++" "+construcciones.get(i).getLongy());
//            else {
//                System.out.println("ENTRE");
//                if(energia>0)
//                    if(construcciones.get(i).getEstado()!=-1){
//                       if( (construcciones.get(i).getDuracion() + construcciones.get(i).getTiempoInicial()) <= turno){
//                             if ( construcciones.get(i) instanceof Militar ){
//
//                                Militar aux=(Militar)construcciones.get(i);
//                                UnidadMilitar unidad=aux.recolectarUnidad() ;
//
//                                //System.out.println("Ingrese coordenadas donde ubicar su unidad");
//                                Datos.mostrar("Ingrese coordenadas donde ubicar su unidad");
////                                Coordenadas coor=Datos.leerCoordenada(mapa.getTamX(),mapa.getTamY());
////                                while (mapa.ocupado(coor.getX(),coor.getY())==true || !mapa.compatible(x,y,unidad)){
////                                    //System.out.println("No puede ubicar su unidad ahi");
////                                    //System.out.println("Ingrese coordenadas donde ubicar su unidad");
////                                    Datos.mostrar("No puede ubicar su unidad ahi");
////                                    Datos.mostrar("Ingrese coordenadas donde ubicar su unidad");
////                                    coor=Datos.leerCoordenada(mapa.getTamX(),mapa.getTamY());
////
////                                 }
////                                mapa.ubicarObjeto(coor.getX(),coor.getY(), unidad);
////                                //System.out.println("Tu unidad ha sido ubicada correctamente");
//                                Datos.mostrar("Tu unidad ha sido ubicada correctamente");
//                                int opcion=0;
////                                if( unidad instanceof Soldado ) opcion=0;
////                                else if( unidad instanceof Tanque ) opcion=1;
////                                else if( unidad instanceof Canhon ) opcion=2;
////                                else if( unidad instanceof Canhonera) opcion = 3;
////                                else if( unidad instanceof PortaAviones) opcion = 4;
////                                else if( unidad instanceof Acorazado ) opcion = 5;
////                                else if( unidad instanceof Avion) opcion = 6;
////                                else if( unidad instanceof Helicoptero) opcion =7;
////                                else if( unidad instanceof Bombardero) opcion = 8;
////                                //System.out.println("OPCION " + opcion);
////                                if (armada[opcion].getTipoUnidad()==null) armada[opcion].setTipoUnidad(unidad.getNombre());
////                                armada[opcion].agregarUnidad(((UnidadMilitar)unidad),coor.getX(),coor.getY());
//
//                             }
//                             else {
//                                    if(construcciones.get(i) instanceof Vivienda)
//                                        ((Vivienda)construcciones.get(i)).recolectar();
//                                    else if(construcciones.get(i) instanceof Gobierno)
//                                        ((Gobierno)construcciones.get(i)).recolectar();
//                                    else if(construcciones.get(i) instanceof Industria)
//                                        ((Industria)construcciones.get(i)).recolectar();
//                             }
//                             //System.out.println("Se recolecto correctamente");
//                             Datos.mostrar("Se recolecto correctamente");
//                       }
//                       else Datos.mostrar("La produccion no esta lista");
//                           //System.out.println("La produccion no esta lista");
//                    }
//                    else //System.out.println("Aun no se asigno ningun trabajo");
//                        Datos.mostrar("Aun no se asigno ningun trabajo");
//                else //System.out.println("No se tiene energia suficiente");
//                    Datos.mostrar("No se tiene energia suficiente");
//            }
//
//    }

    public void construir(int x,int y,int indiceC,int indclase){

//        System.out.println("Elija la construccion");
//        Construccion.mostrarDisponibles();
        //System.out.println("ENTRE");
        //System.out.println("aca"+x+" "+y);
        Datos.mostrarPrincipal("aca"+x+" "+y);
        switch(indiceC) {
            case   1: //MILITAR
                construirMilitar(indclase,x,y);
                break; //break caso 1
            case   2: //INDUSTRIA
               contruirIndustria(indclase,x,y);
                break; //break caso 2

            case   3: //VIVIENDA
                contruirVivienda(indclase,x,y);
                break; //break caso 3

            case   4: //GOBIERNO
                contruirGobierno(indclase,x,y);
                break; //break caso 4

        } // Fin switch general (indiceC)
    } //Fin class CONSTRUIR



    public void crear(int x,int y){
		//(CONSTRUCCION(X,Y)??? Mostrar personajes_disponibles : salir)
		//LEER PERSONAJE ELEGIDO
		///CREAR PERSONAJE Y UBICAR(pedir (x,y) y validar)
        if(mapa.ocupado(x, y)){
            Construccion objeto= (Construccion)mapa.getObjeto(x, y);
            if (objeto.getEstado()== -1){
                if(energia>0){
                    if( objeto instanceof Industria){
                        ((Industria)objeto).mostrar();
                        int opcion=Datos.leerOpcion(0,4);
                        ((Industria)objeto).asignarTrabajo(opcion);
                    }
                    else if( objeto instanceof Militar){
                        ((Militar)objeto).mostrar();
                        int opcion=Datos.leerOpcion(0,3);
                        ((Militar)objeto).asignarTrabajo(opcion);
                   // System.out.println("opcionnnnnnn "+opcion);
                    }
                    else System.out.println("No se puede asignar un trabajo a este tipo de edificio");
                }
            else System.out.println("Falta energia");
            }
            else System.out.println("Esta construccion ya tiene trabajo asignado");
        }
        else System.out.println("No hay edificio en esa ubicacion");
    }
    public void turno(){
        turno++;
        mapa.mostrar();
//        System.out.println("Estado del juego");
//        System.out.println("Gold "+ gold+" Madera "+ madera + " Petroleo "+petroleo+ " Silver "+ silver);

//        if( nivel < (int)Math.sqrt((double)experiencia)+1 ) {nivel++;energia=30;}
//        System.out.println("Nivel actual "+nivel);
//        System.out.println("Energia actual "+ energia);
//        System.out.println("Experiencia actual "+ experiencia);
//	Juego.turno++;
//        for(int i=0;i<construcciones.size();i++){
//	    if(construcciones.get(i).getEstado()!=-1){
//                if(construcciones.get(i).getDuracion()+construcciones.get(i).getTiempoInicial() <= turno)
//	            System.out.println("Se puede recolectar en esta posicion "+ posicion.get(i).getX() + "," + posicion.get(i).getY());
//            }
//        }
    }

    public void construirMilitar(int indclase,int x, int y){
        switch(indclase){
            case 1: //CUARTEL
                if(Requisitos.construir(Cuartel.nivelRequerido,Cuartel.precio,x,y,Cuartel.longx,Cuartel.longy,Cuartel.compatible,mapa)){
                   Cuartel ocuartel=new Cuartel();
                   mapa.ubicarConstruccion(x,y,Cuartel.longx,Cuartel.longy,ocuartel,ocuartel.getSimbolo());
                   GestorConstrucciones.addConstruccion(ocuartel,new Coordenadas(x,y));
                   Datos.mostrar("Tu construccion ha sido ubicada correctamente");
               }
                break; //break caso 1

            case 2: //ASTILLERO
                if(Requisitos.construir(Astillero.nivelRequerido,Astillero.precio,x,y,Astillero.longx,Astillero.longy,Astillero.compatible,mapa)){
                    Astillero oastillero=new Astillero();
                    mapa.ubicarConstruccion(x,y,Astillero.longx,Astillero.longy,oastillero,oastillero.getSimbolo());
                    GestorConstrucciones.addConstruccion(oastillero,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 2

            case 3://HANGAR
                if(Requisitos.construir(Hangar.nivelRequerido,Hangar.precio,x,y,Hangar.longx,Hangar.longy,Hangar.compatible,mapa)){
                    Hangar ohangar=new Hangar();
                    mapa.ubicarConstruccion(x,y,Hangar.longx,Hangar.longy,ohangar,ohangar.getSimbolo());
                    GestorConstrucciones.addConstruccion(ohangar,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 3

        }//FIN SWITCH
    }

    public void contruirIndustria(int indclase,int x, int y){
        switch(indclase){
            case 1: //POZO PETROLERO
                if(Requisitos.construir(PozoPetrolero.nivelRequerido,PozoPetrolero.precio,x,y,PozoPetrolero.longx,PozoPetrolero.longy,PozoPetrolero.compatible,mapa)){
                    PozoPetrolero opozo=new PozoPetrolero();
                    mapa.ubicarConstruccion(x,y,PozoPetrolero.longx,PozoPetrolero.longy,opozo,opozo.getSimbolo());
                    GestorConstrucciones.addConstruccion(opozo,new Coordenadas(x,y));
                    //Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 1

            case 2://GRANJA
                if(Requisitos.construir(Granja.nivelRequerido,Granja.precio,x,y,Granja.longx,Granja.longy,Granja.compatible,mapa)){
                    Granja ogranja=new Granja();
                    mapa.ubicarConstruccion(x,y,Granja.longx,Granja.longy,ogranja, ogranja.getSimbolo());
                    GestorConstrucciones.addConstruccion(ogranja,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 2

            case 3:// MINA DE MINERALES
                if(Requisitos.construir(MinaDeMinerales.nivelRequerido,MinaDeMinerales.precio,x,y,MinaDeMinerales.longx,MinaDeMinerales.longy,MinaDeMinerales.compatible,mapa)){
                    MinaDeMinerales omina=new MinaDeMinerales();
                    mapa.ubicarConstruccion(x,y,MinaDeMinerales.longx,MinaDeMinerales.longy,omina,omina.getSimbolo());
                    GestorConstrucciones.addConstruccion(omina,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 3

            case 4: // ASERRADERO
                if(Requisitos.construir(Aserradero.nivelRequerido,Aserradero.precio,x,y,Aserradero.longx,Aserradero.longy,Aserradero.compatible,mapa)){
                    Aserradero oaserra=new Aserradero();
                    mapa.ubicarConstruccion(x,y,Aserradero.longx,Aserradero.longy,oaserra,oaserra.getSimbolo());
                    GestorConstrucciones.addConstruccion(oaserra,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break;// Break caso 4

        } //FIN SWITCH
    }

    public void contruirVivienda(int indclase,int x, int y){
        switch(indclase){
            case 1: //cabanha
                if(Requisitos.construir(Cabanha.nivelRequerido,Cabanha.precio,x,y,Cabanha.longx,Cabanha.longy,Cabanha.compatible,mapa)){
                    Cabanha ocabanha=new Cabanha();
                    mapa.ubicarConstruccion(x,y,Cabanha.longx,Cabanha.longy,ocabanha,ocabanha.getSimbolo());
                    GestorConstrucciones.addConstruccion(ocabanha,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 1

            case 2: //casa
                if(Requisitos.construir(Casa.nivelRequerido,Casa.precio,x,y,Casa.longx,Casa.longy,Casa.compatible,mapa)){
                    Casa ocasa=new Casa();
                    mapa.ubicarConstruccion(x,y,Casa.longx,Casa.longy,ocasa,ocasa.getSimbolo());
                    GestorConstrucciones.addConstruccion(ocasa,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 2

            case 3: //bungalow
                if(Requisitos.construir(Bungalow.nivelRequerido,Bungalow.precio,x,y,Bungalow.longx,Bungalow.longy,Bungalow.compatible,mapa)){
                    Bungalow obungalow=new Bungalow();
                    mapa.ubicarConstruccion(x,y,Bungalow.longx,Bungalow.longy,obungalow,obungalow.getSimbolo());
                    GestorConstrucciones.addConstruccion(obungalow,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 3

            case 4: //palafito
                if(Requisitos.construir(Palafito.nivelRequerido,Palafito.precio,x,y,Palafito.longx,Palafito.longy,Palafito.compatible,mapa)){
                    Palafito opalafito=new Palafito();
                    mapa.ubicarConstruccion(x,y,Palafito.longx,Palafito.longy,opalafito,opalafito.getSimbolo());
                    GestorConstrucciones.addConstruccion(opalafito,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 4
        } //Fin switch
    }
    public void contruirGobierno(int indclase,int x, int y){
        switch(indclase){
            case 1: //PARLAMENTO
                if(Requisitos.construir(Parlamento.nivelRequerido,Parlamento.precio,x,y,Parlamento.longx,Parlamento.longy,Parlamento.compatible,mapa)){
                    Parlamento oparlamento=new Parlamento();
                    mapa.ubicarConstruccion(x,y,Parlamento.longx,Parlamento.longy,oparlamento,oparlamento.getSimbolo());
                    GestorConstrucciones.addConstruccion(oparlamento,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 1

            case 2://MANSION
                if(Requisitos.construir(Mansion.nivelRequerido,Mansion.precio,x,y,Mansion.longx,Mansion.longy,Mansion.compatible,mapa)){
                    Mansion omansion=new Mansion();
                    mapa.ubicarConstruccion(x,y,Mansion.longx, Mansion.longy,omansion,omansion.getSimbolo());
                    GestorConstrucciones.addConstruccion(omansion,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 2

            case 3://PALACIO
                if(Requisitos.construir(Palacio.nivelRequerido,Palacio.precio,x,y,Palacio.longx,Palacio.longy,Palacio.compatible,mapa)){
                    Palacio opalacio=new Palacio();
                    mapa.ubicarConstruccion(x,y,Palacio.longx,Palacio.longy,opalacio,opalacio.getSimbolo());
                    GestorConstrucciones.addConstruccion(opalacio,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 3

            case 4://Intendencia
                if(Requisitos.construir(Intendencia.nivelRequerido,Intendencia.precio,x,y,Intendencia.longx,Intendencia.longy,Intendencia.compatible,mapa)){
                    Intendencia ointendencia=new Intendencia();
                    mapa.ubicarConstruccion(x,y,Intendencia.longx,Intendencia.longy,ointendencia,ointendencia.getSimbolo());
                    GestorConstrucciones.addConstruccion(ointendencia,new Coordenadas(x,y));
                    Datos.mostrar("Tu construccion ha sido ubicada correctamente");
                }
                break; //break caso 4

        } //FIN SWITCH
    }

} //FIN CLASE JUEGO
